Сложеност израчунавања

Важно питање за практичну примену написаних програма је то колико ресурса програм захтева за своје извршавање. Најважнији ресурси су сигурно време потребно за извршавање програма и заузета меморија, мада се могу анализирати и други ресурси (на пример, код мобилних уређаја важан ресурс је утрошена енергија). Дакле, обично се разматрају:

На пример, ако један програм израчунава потребан број за 10 секунди, а други за два и по минута, јасно је да је први програм практично примењивији. Међутим, ако први програм за своје извршавање захтева преко 10 гигабајта меморије, други око 1 гигабајт, а ми имамо рачунар са 4 гигабајта меморије, први програм нам је практично неупотребљив (иако ради много брже од другог). Ипак, с обзиром на то да савремени рачунарски системи имају прилично велику количину меморије, време је чешће ограничавајући фактор и у наставку ћемо се чешће бавити анализом временске ефикасности алгоритама.

При том, прилично је релативно колико брзо програм треба да ради да бисмо га сматрали ефикасним. На пример, ако програм успе да за пола сата реши неки нерешен математички проблем, који људи годинама нису могли да реше, он је свакако користан и можемо га сматрати веома ефикасним. Са друге стране, ако програм уграђен у аутомобил контролише кочнице приликом проклизавања, њему и неколико стотина милисекунди израчунавања може бити превише, јер ће за то време аутомобил неконтролисано слетети са пута.

Понашање програма (па и количина утрошених ресурса), наравно, зависи од његових улазних параметара. Јасно је, на пример, да ће програм брже израчунати просечну оцену двадесетак ученика једног одељења, него просечну оцену неколико десетина хиљада ученика који полажу Државну матуру. Такође се може претпоставити да понашање програма не зависи од конкретних оцена које су ученици добили, већ само од броја ученика. Зато сложеност алгоритма често изражавамо у функцији величине (димензије) његових улазних параметара, а не самих вредности параметара. Величина улазне вредности може бити број улазних елемената које треба обрадити, број битова потребних за записивање улаза који треба обрадити, сам улазни број који треба обрадити итд. Увек је потребно експлицитно навести у односу на коју величину улазне вредности се разматра сложеност.

Са друге стране, неки се алгоритми не извршавају исто за све улазе исте величине, па је потребно наћи начин за описивање ефикасности алгоритма на разним могућим улазима исте величине.

Некада се анализа врши тако да се процени укупно време потребно да се изврши одређен број сродних операција. Тај облик анализе назива се амортизована анализа и у тим ситуацијама нам није битно време извршавања појединачних операција, већ само збирно време извршавања свих операција.

У наставку ће, ако није другачије речено другачије, бити подразумевана анализа најгорег случаја.